package com.mipo.proxypattern.remoteproxy;

/**
	动态代理的主要应用其他答案已经说得很好了，在Java项目里面Spring的AOP应用就是动态代理的相当完美的应用，这里说一下动态代理的另外一个应用方向——远程代理。
	如果本地有一个项目需要调用远程模块的接口怎么办？比较直接的方法可能就是自己写一个Socket连接，然后自定义一个应用层协议来说明什么报文对应调用什么接口。例如4字节（int）          20字节                    20字节 
	报文长度 接口全名 参数列表 上面这个报文为我自定义的报文，
	使用这个远程被调用端可以在解析之后调用本地方法之后可以将结果返回（这又得定义一个返回协议或者只能调用void型方法且无法知道执行结果）。
	这样一路下来，远程调用会相当繁琐，而且程序员还得跟业务无关的网络打交道（例如要处理断开、TCP粘包之类的情况）。
	如果调用过多，这个时候就可以将网络通信模块进行抽取作为一个专门的调用的模块了，
	例如：
	interface RemoteInvoke{
		Object invoke(Method method,Object… args);
	}
	定义一个接口，提供一个屏蔽了底层网络通信的方法，这样程序员在进行业务调用的时候就可以不用理会底层网络的实现情况了。
	不过以上的方法虽然好，但是远程调用模块的存在终究不美，Java可以提供更好的解决方法——动态代理。
	动态代理的实现由Proxy与InvocationHandler处理，其中InvocationHandler类进行具体调用处理。
	于是我们可以将前面的网站调用模块RemoteInvoke进一步封装在InvocationHandler.invoke里面。
	public class InvocationDo implements InvocationHandler {
		private RemoteInvoke ri;
		public InvocationDo(RemoteInvoke ri) {
			this.ri = ri;
		}
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			return ri.invoke(method, args);
		}
	}
	这样业务调用者就可以在完全不知道网络调用的情况下（甚至都不用知道RemoteInvoke模块的存在），就可以实现对远程模块的调用了。
	动态代理是实现rpc的基础
 */

public class Main {
	public static void main(String[] args) {
		
	}
}




